<?php
/**
 * 这是一个使用PHP内部接口Iterator的示例，实现了这个接口的任何类都可以在for循环中使用
 * 这个内部结口的结构如下:
 * interface Iterator {
 * 	public function rewind();	//将迭代器倒回到第一个元素
 * 	public function next();	//向前移到下一个元素
 * 	public function key();		//返回当前元素的键
 * 	public function current();	//返回当前元素的值
 *	public function valid();	//检查当前位是否有效
 * }
 * User: ford
 * Date: 15-6-18
 * Time: 上午11:59
 */

class Itera implements Iterator {
	static $static = "不用初始化就可以直接使用的静态变量和方法，这个可以用于数据库连接吧<br />";
	private $items;
	private $index = 0;

	function __construct(array $items) {
		$this->items = $items;
	}

	function rewind() {
		$this->index = 0;
	}

	function current() {
		return $this->items[$this->index];
	}

	function key() {
		return $this->index;
	}

	function next() {
		$this->index++;
		if(isset($this->items[$this->index])) {
			return $this->items[$this->index];
		} else {
			return null;
		}
	}

	function valid() {
		return isset($this->items[$this->index]);
	}
}

echo Itera::$static;
$x = new Itera(range('A', 'D')); //用数组{‘A', 'B', 'C', 'D')初始化类

//注意，下面的语法是给数组用的，但是$x明显不是数组，由于它实现了内部接口Iterator才实现了此功能
//这里的循环是针对对象内部的数组属性，而不是对象本身，因为在实现的接口方法中操作的就是对象的数组属性
foreach ($x as $key=>$val) {
	echo "key = $key\t value = $val<br />\n";
}